package com.ithuameng.admin.app.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ithuameng.admin.app.system.model.User;
import com.ithuameng.admin.app.system.model.admin.qo.RoleUserQo;
import com.ithuameng.admin.app.system.model.admin.qo.UserQo;
import com.ithuameng.admin.enums.YesNo;

import java.util.List;

/**
 * User service
 *
 * @author ithuameng
 */
public interface IUserService extends IService<User> {

    IPage<User> listUser(Page<User> page, UserQo userQo);

    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户详情
     */
    User getUserByUsername(String username);

    /**
     * 校验用户名称是否唯一
     *
     * @param username 用户名称
     * @return 结果
     */
    boolean checkUsernameUnique(String username);

    /**
     * 校验手机号码是否唯一
     *
     * @param mobile 手机号码
     * @return 结果
     */
    boolean checkMobileUnique(String mobile);

    /**
     * 校验手机号码是否唯一
     *
     * @param mobile         手机号码
     * @param execuldeUserId 排除用户Id
     * @return 结果
     */
    boolean checkMobileUnique(String mobile, Long execuldeUserId);

    /**
     * 保存用户和角色
     *
     * @param user  用户
     * @param roleIds 角色集合
     */
    void saveWithRoles(User user, List<Long> roleIds);

    /**
     * 更新用户和角色
     *
     * @param user  用户
     * @param roleIds 角色集合
     */
    void updateWithRoles(User user, List<Long> roleIds);

    /**
     * 更新用户状态
     *
     * @param userId 用户编号
     * @param status 状态
     */
    void updateStatus(Long userId, YesNo status);

    /**
     * 重置用户密码
     *
     * @param userId   用户编号
     * @param password 密码
     */
    void resetPassword(Long userId, String password);

    /**
     * 用户授权角色
     *
     * @param userId  用户ID
     * @param roleIds 角色组
     */
    void updateUserRole(Long userId, Long[] roleIds);

    /**
     * 根据条件分页查询未分配用户角色列表
     *
     * @param page       分页参数
     * @param roleUserQo 查询条件
     * @return 列表
     */
    IPage<User> selectAllocatedList(Page<User> page, RoleUserQo roleUserQo);

    /**
     * 根据条件分页查询未分配用户角色列表
     *
     * @param page       分页参数
     * @param roleUserQo 查询条件
     * @return 列表
     */
    IPage<User> selectUnallocatedList(Page<User> page, RoleUserQo roleUserQo);

    /**
     * 批量删除用户信息
     *
     * @param userIds 需要删除的用户ID
     * @return 结果
     */
    boolean deleteUserByIds(Long[] userIds);
}
